//
//  HomeTableViewController.swift
//  MicroBlog
//
//  Created by 002 on 15/10/14.
//  Copyright © 2015年 002. All rights reserved.
//

import UIKit
import SVProgressHUD

//private let WBStatusCellNormalId = "WBStatusCellNormalId"
let WBStatusCellNormalId = "WBStatusCellNormalId"
let WBStatusCellRetweetedId = "WBStatusCellRetweetedId"

class HomeTableViewController: VisitorTableViewController {

   private lazy var listViewModel = StatusListViewModel()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // 判断是否登录
        if !UserAccountViewModel.shareUserAccount.isUserLogin {
            
            // 未登录则进入访客视图界面
            visitor?.setupVisitorView(nil, messageString: "关注一些人，回这里看看有什么惊喜")
            
            return
        }
        
        // 注册cell
        prepareForTableView()
        
        // 加载数据
        loadData()

        // 注册通知
        NSNotificationCenter.defaultCenter().addObserverForName(WBStatusSelectedPhotoNotification, object: nil, queue: nil) { [weak self] (notification) -> Void in
            
            // 所选图片的下标
            guard let indexPath = notification.userInfo?["WBStatusSelectedPhotoIndexPathKey"] as?  NSIndexPath else {
                return
            }
            
            // 所选图片所在的数组
            guard let URLS = notification.userInfo?["WBStatusSelectedPhotoURLSKey"] as? [NSURL] else {
                return
            }
            
            // 判断 cell 是否遵守展现动画协议
            guard let cell = notification.object as? PhotoBrowserPresentDelegate else {
                return
            }
            
            // 创建图片查看控制器
            let photoBrowser = PhotoBrowserViewController(indexPath: indexPath, urls: URLS)
//            let nav = UINavigationController.init(rootViewController: photoBrowser)
            
//            // 设置 model 转场样式
            photoBrowser.modalPresentationStyle = UIModalPresentationStyle.Custom
            
            // 设置转场动画代理
            photoBrowser.transitioningDelegate = self!.photoBrowserAnimator

            // 设置代理动画的参数
            self?.photoBrowserAnimator.setDelegateParams(cell, dismissDelegate: photoBrowser, indexPath: indexPath)
            
            // 跳入图片查看控制器
            self!.presentViewController(photoBrowser, animated: true, completion: nil)
        }
}

    // 移除通知观察者
    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    // 准备表格
    private func prepareForTableView() {
        // 注册可重用cell
        tableView.registerClass(StatusNormalCell.self, forCellReuseIdentifier: WBStatusCellNormalId)
        tableView.registerClass(StatusRetweetedCell.self, forCellReuseIdentifier: WBStatusCellRetweetedId)
        
        // 取消顶部分割线
        tableView.separatorStyle = .None
        tableView.bounces = true
        // 下拉刷新控件默认没有 -高度60
        refreshControl = WBRefreshControl()
        
        // 添加监听
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
        
        // 预估行高需要尽量准确
        tableView.estimatedRowHeight = 400
        
        // 设置上拉视图
        tableView.tableFooterView = pullupView
//        print("pppp-\(tableView.rowHeight)")
    }
   
    // MARK:加载微博数据
    @objc private func loadData() {
       
        // 开启刷新控件
        refreshControl?.beginRefreshing()
        
        listViewModel.loadStatus(isPullup: pullupView.isAnimating()) { (isSuccessed) -> () in
            
            // 关闭控件刷新
            self.refreshControl?.endRefreshing()
            // 暂停上拉刷新动画
            self.pullupView.stopAnimating()
            if !isSuccessed {
                SVProgressHUD.showInfoWithStatus("加载数据错误，请稍后再试")
                return
            }
            
            self.showPulldownTip()
            
            // 4. 刷新数据
            self.tableView.reloadData()
        }
    }
    
    // 显示下拉刷新提示
    private func showPulldownTip() {
        
        // 判断是否下拉，不是返回
        guard let pulldownCount = listViewModel.pulldownCount else {
            return
        }
        
        pulldownLabel.text = pulldownCount > 0 ? "刷新到\(pulldownCount)条微博" : "没有新微博"
        
        // 设置位置
        let height : CGFloat = 44
        let width : CGFloat = self.view.bounds.width
        let rect = CGRectMake(0, 0, width, height)
        pulldownLabel.frame = CGRectOffset(rect, 0, -2 * height)
        
        UIView.animateWithDuration(1.0, animations: { () -> Void in
            self.pulldownLabel.frame = CGRectOffset(rect, 0, height)
            }) { (_) -> Void in
                UIView.animateWithDuration(1.0, animations: { () -> Void in
                    self.pulldownLabel.frame = CGRectOffset(rect, 0, -2 * height)
                })
        }
    }
    
    // MARK:懒加载控件
    
    // 下拉刷新计数提示
    private lazy var pulldownLabel : UILabel = {
    
        let label = UILabel.init(title: "", fontSize: 18, color: UIColor.whiteColor())
        
        label.backgroundColor = UIColor.orangeColor()
        
        // 添加到navigationbar
        self.navigationController?.navigationBar.insertSubview(label, atIndex: 0)
        
        return label
    }()
    
    // 上拉刷新提示控件
    private lazy var pullupView : UIActivityIndicatorView = {
       
        let indicator = UIActivityIndicatorView.init(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
        indicator.color = UIColor.lightGrayColor()
        return indicator
    }()
    
    // 照片查看转场动画代理
    private lazy var photoBrowserAnimator : PhotoBrowserAnimator = PhotoBrowserAnimator()
}

// MARK: - 数据源方法
extension HomeTableViewController {
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listViewModel.statusList.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        // 1->获取视图模型
        let vm = listViewModel.statusList[indexPath.row]
        
        // 2->根据视图视图模型是否有转发微博创建不同的cell
        let cell = tableView.dequeueReusableCellWithIdentifier(vm.cellId, forIndexPath: indexPath) as! StatusCell
        
        // 3->设置cell的视图模型
        cell.viewModel = vm
//        print("\(vm.status.text):\(vm.cellId)----\(vm.rowHeight)")
        
        // 4. 判断是否最后一条微博
        if indexPath.row == self.listViewModel.statusList.count - 1 && !pullupView.isAnimating() {
            
            // 是则开始动画
            pullupView.startAnimating()
            
            // 上拉刷新加载数据
            loadData()
        }
        
        cell.cellDelegate = self
        return cell
    }
    
    /**
    行高
    
    -- 设置了预估行高
    * 当前显示的行高方法会调用三次（每个版本的Xcode调用次数可能不同）
    
    问题：预估行高如果不同，计算的次数不同！
    
    1. 使用预估行高，计算出预估的 contentSize
    2. 根据预估行高，判断计算次数，顺序计算每一行的行高，更新 contentSize
    3. 如果预估行高过大，超出预估范围，顺序计算后续行高，一直到填满屏幕退出，同时更新 contentSize
    4. 使用预估行高，每个 cell 的显示前需要计算，单个 cell 的效率是低的，从整体效率高！
    
    执行顺序 行数 -> 每个[cell -> 行高]
    
    预估行高：尽量靠近！
    
    -- 没设置了预估行高
    * 1. 计算所有行的高度
    * 2. 再计算显示行的高度
    
    执行顺序 行数 -> 行高 -> cell
    
    问题：为什么要调用所有行高方法？UITableView 继承自 UIScrollView
    表格视图滚动非常流畅 -> 需要提前计算出 contentSize
    */
    // MARK:返回行高
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        
        return listViewModel.statusList[indexPath.row].rowHeight
    }
}

// MARK: - StatusCellDelegate
extension HomeTableViewController: StatusCellDelegate {
    
    func statusCellDidClickUrl(url: NSURL) {
        
        // 建立 webView 控制器
        let vc = HomeWebViewController(url: url)
        vc.hidesBottomBarWhenPushed = true
        
        navigationController?.pushViewController(vc, animated: true)
    }
}
